import {
	HTTP_REQUEST_URL,
	HEADER,
	TOKENNAME,
	API
} from '@/config/app';
import Cache from './cache'
import {isWeChatMiniProgram} from './platform.js'

/**
 * 将Base64图片转换为临时文件路径（适用于小程序环境）
 * @param {string} base64 - Base64图片数据
 * @returns {Promise} 返回临时文件路径的Promise
 */
function base64ToTempFilePath(base64) {
  return new Promise((resolve, reject) => {
    // 检查是否在小程序环境
    if (!isWeChatMiniProgram()) {
      reject(new Error('此方法仅适用于小程序环境'));
      return;
    }
    
    // 提取Base64数据部分（移除data:image/png;base64,前缀）
    const base64Data = base64.indexOf('base64,') !== -1 
      ? base64.split(',')[1] 
      : base64;
    
    const fileManager = wx.getFileSystemManager();
    const tempFilePath = `${wx.env.USER_DATA_PATH}/temp_image_${Date.now()}.png`;
    
    fileManager.writeFile({
      filePath: tempFilePath,
      data: base64Data,
      encoding: 'base64',
      success: () => {
        resolve(tempFilePath);
      },
      fail: (error) => {
        reject(new Error(`写入临时文件失败: ${error.errMsg}`));
      }
    });
  });
}

/**
 * 在H5环境下将Base64转换为Blob URL
 * @param {string} base64 - Base64图片数据
 * @returns {string} Blob URL
 */
function base64ToBlobUrl(base64) {
  // 解析Base64字符串
  const parts = base64.split(';base64,');
  if (parts.length !== 2) {
    throw new Error('Base64格式不正确');
  }
  
  const mimeType = parts[0].split(':')[1];
  const base64Data = parts[1];
  
  // 解码Base64数据
  const byteCharacters = atob(base64Data);
  const byteArrays = [];
  
  for (let offset = 0; offset < byteCharacters.length; offset += 512) {
    const slice = byteCharacters.slice(offset, offset + 512);
    
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }
  
  // 创建Blob对象并生成URL
  const blob = new Blob(byteArrays, { type: mimeType });
  return URL.createObjectURL(blob);
}
/**
 * 替代方案：使用XMLHttpRequest上传（避免multipart boundary错误）
 * @param {Object} options - 上传配置
 * @returns {Promise} 返回上传结果的Promise
 */
function uploadBase64WithXHR(options) {
	const token=Cache.get(TOKENNAME)
	//登录过期自动登录
	if (!token) {
		// toLogin();
		return Promise.reject({
			msg: `未登录`,
			code:401
		});
	}
  return new Promise((resolve, reject) => {
    try {
      const {
        base64,
        formData = {},
        header = {
			"Content-Type": "multipart/form-data",
			[TOKENNAME]: 'Bearer ' + token
		},
        fileName = `image_${Date.now()}.png`,
        name = 'file'
      } = options;

      // 验证参数
      if (!base64) {
        reject(new Error('base64参数不能为空'));
        return;
      }

      // 解析Base64字符串
      const parts = base64.split(';base64,');
      if (parts.length !== 2) {
        throw new Error('Base64格式不正确');
      }
      
      const mimeType = parts[0].split(':')[1];
      const base64Data = parts[1];
      
      // 解码Base64数据
      const byteCharacters = atob(base64Data);
      const byteArrays = [];
      
      for (let offset = 0; offset < byteCharacters.length; offset += 512) {
        const slice = byteCharacters.slice(offset, offset + 512);
        
        const byteNumbers = new Array(slice.length);
        for (let i = 0; i < slice.length; i++) {
          byteNumbers[i] = slice.charCodeAt(i);
        }
        
        const byteArray = new Uint8Array(byteNumbers);
        byteArrays.push(byteArray);
      }
      
      // 创建Blob对象
      const blob = new Blob(byteArrays, { type: mimeType });
      
      // 创建FormData
      const formDataObj = new FormData();
      formDataObj.append(name, blob, fileName);
      
      // 添加其他表单数据
      Object.keys(formData).forEach(key => {
        formDataObj.append(key, formData[key]);
      });

      // 使用XMLHttpRequest发送请求
      const xhr = new XMLHttpRequest();
      
      xhr.open('POST', `${API}/client/file/oss/upload`);
      
      // 设置请求头
      Object.keys(header).forEach(key => {
        if (key.toLowerCase() !== 'content-type') {
          xhr.setRequestHeader(key, header[key]);
        }
      });
      
      xhr.onload = function() {
        if (xhr.status >= 200 && xhr.status < 300) {
          try {
            const response = JSON.parse(xhr.responseText);
            resolve({
              statusCode: xhr.status,
              data: response,
              errMsg: 'uploadFile:ok'
            });
          } catch (e) {
            resolve({
              statusCode: xhr.status,
              data: xhr.responseText,
              errMsg: 'uploadFile:ok'
            });
          }
        } else {
          reject({
            statusCode: xhr.status,
            errMsg: `uploadFile:fail ${xhr.status}`
          });
        }
      };
      
      xhr.onerror = function() {
        reject({
          errMsg: 'uploadFile:fail network error'
        });
      };
      
      xhr.send(formDataObj);
      
    } catch (error) {
      reject({
        errMsg: `uploadFile:fail ${error.message}`
      });
    }
  });
}












/**
 * 智能上传函数 - 自动选择最佳方案
 * @param {Object} options - 上传配置
 * @param {boolean} forceXHR - 是否强制使用XHR（解决boundary错误）
 * @returns {Promise} 返回上传结果的Promise
 */
export default function requestFile(options, forceXHR = false) {
  // 如果强制使用XHR或在H5环境中遇到boundary错误，使用XHR方案
  return uploadBase64WithXHR(options);
}


/**
 * 发送请求
 */
// export default function requestFile1(file,data) {
// 	const token=Cache.get(TOKENNAME)
// 	//登录过期自动登录
// 	if (!token) {
// 		// toLogin();
// 		return Promise.reject({
// 			msg: `未登录`,
// 			code:401
// 		});
// 	}
	
	
	
// 	return new Promise((reslove, reject) => {		
// 		uni.uploadFile({
// 			url: `${API}/client/file/oss/upload`,
// 			file:file,
// 			name:'file',
// 			formData: data,
// 			header: {
// 				"Content-Type": "multipart/form-data",
// 				[TOKENNAME]: 'Bearer ' + token
// 			},
// 			success: function(res) {
// 				console.log(res)
// 			},
// 			fail: function(res) {
// 				reject({
// 					title: '上传图片失败'
// 				})
// 			}
// 		})
		
// 	});
// }

